package com.gjzhao.fmmall.interceptor;

import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.gjzhao.fmmall.constant.ConstantInfo;
import com.gjzhao.fmmall.entity.Users;
import java.util.concurrent.TimeUnit;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

/**
 * @Description: 对redis中存放的token信息进行重写设置过期时间:
 * 业务流程分析：
 *   - 1.用户发送请求，携带token信息(未登录时token信息为空，登录时token信息不为空)
 *   - 2.拦截器(拦截所有请求)进行拦截，只要token中有值，就去redis中进行查询用户信息
 *     - 2.1 存在用户信息，说明当前是登录状态，访问的可能是受限资源也可能是非受限资源，对token的过期时间重新进行设置
 *     - 2.2 不存在用户信息，说明当前访问的是一定是非受限资源
 *
 * @Author: gjzhao
 * @Date Created in 2022-01-26 10:44 上午
 */
@Component
public class RenewalInterceptor implements HandlerInterceptor {

    private Logger logger = LoggerFactory.getLogger(getClass());

    @Autowired
    private StringRedisTemplate stringRedisTemplate;


    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        String token = request.getHeader(ConstantInfo.REQUEST_HEADER_PARAM_TOKEN);
        if (StrUtil.isNotBlank(token)) {
            String userStr = stringRedisTemplate.boundValueOps(token).get();
            if (StrUtil.isNotBlank(userStr)) {
                Users user = JSONUtil.toBean(userStr, Users.class);
                //只要当前token存放的用户信息不为空，就重新设置过期时间为30分钟
                stringRedisTemplate.boundValueOps(token).expire(30, TimeUnit.MINUTES);
                logger.info("----当前登录用户:{}正在访问服务器资源，重新设置token过期时间----",user.getUsername());
            }
        }
        // 该拦截器只针对token不为空的情况做续命处理，需要放行
        return true;
    }
}
